/* includes */
 
#include <vxWorks.h>
#include <vsbConfig.h>
#include <intLib.h>
#include <errnoLib.h>
#include <errno.h>
#include <sioLib.h>
#include <ioLib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vxAtomicLib.h>
#include <semLib.h>
#include <sysLib.h>
#include <vmLib.h>
#include <stdio.h>
#include <hwif/vxBus.h>
#include <hwif/buslib/vxbFdtLib.h>
#include <taskLib.h>
#include <pipeDrv.h>      /* 管道驱动 */
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/times.h>  // Add this include for struct timeval

extern void axiFpgaOpen(VXB_DEV_ID * ppDev, UINT32 unit);
extern STATUS timeDateShow(void); 
extern STATUS srio_server_init();
extern STATUS srio_client_init();

extern STATUS tcp_server_start(unsigned short port);

// 全局结构体定义
typedef struct {
    UINT32 slot_number;  // 十六进制槽位号
    const char ip[16]; // 对应IP地址
    const char sgmiiip[16]; // 对应IP地址
    const char* role;  // 新增主从属性
    const char* macaddress;  // 新增主从属性
    
} SlotIPMapping;


// 定义一个全局变量来存储设备角色
int device_role; // 0 表示主设备，1 表示从设备

// 修改后的槽位号-IP映射表（主设备为偶数槽位号）
const SlotIPMapping slot_ip_map[8] = {
	{0x1, "192.168.4.21","192.168.3.18", "master", "00:04:9f:a1:aa:04"},
    {0x0, "192.168.4.20","192.168.3.19", "slave", "00:04:9f:a1:aa:03"},
    {0x3, "192.168.4.23","192.168.3.18", "master", "00:04:9f:a1:aa:03"},
    {0x2, "192.168.4.22","192.168.3.19", "slave", "00:04:9f:a1:aa:04"},
    {0x5, "192.168.4.25","192.168.3.18", "master", "00:04:9f:a1:aa:03"},
    {0x4, "192.168.4.24","192.168.3.19", "slave", "00:04:9f:a1:aa:04"},
    {0x7, "192.168.4.27","192.168.3.18", "master", "00:04:9f:a1:aa:03"},
    {0x6, "192.168.4.26","192.168.3.19", "slave", "00:04:9f:a1:aa:04"}
};

void start(void) 
{
	char cmd[100];  // Declare the variable.
	char cmd2[100];  // Declare the variable
	int i;
	int found = 0;
	UINT32 actual_slot;
	VXB_DEV_ID pDev;
	
	
	axiFpgaOpen(&pDev,0);		
	timeDateShow();
	
	actual_slot = get_fpga_slot_number(); // 读取实际槽位号
	for(i = 0; i < 8; i++) {
		if(slot_ip_map[i].slot_number == actual_slot) {// 构造ifconfig命令（假设使用eth0接口）
		
			if(ifconfig("gem0 down") != 0) {  // 执行配置命令
				printf("关闭第一路网口失败!\n");
			}
			else
				printf("关闭第一路网口成功!\n");
			// 构造ifconfig命令（假设使用eth0接口）
			snprintf(cmd, sizeof(cmd), "gem0 %s netmask 255.255.255.0 up", slot_ip_map[i].ip);
			printf("匹配到第一路IP: %s\n", slot_ip_map[i].ip);
			if(ifconfig(cmd) != 0) {  // 执行配置命令
				printf("第一路IP配置失败!\n");
			}
			else
				printf("第一路IP配置成功!\n");
			
 
			// 构造ifconfig命令（假设使用eth0接口）
			// snprintf(cmd2, sizeof(cmd2), "gem1 %s netmask 255.255.255.0 lladdr %s up", \
			// 		slot_ip_map[i].sgmiiip, slot_ip_map[i].macaddress);
			// printf("匹配到第二路IP: %s\n", cmd2);
			// if(ifconfig(cmd2) != 0) {  // 执行配置命令
			// 	printf("第二路IP配置失败!\n");
			// }
			// else
			// 	printf("第二路IP配置成功!\n");
			
			// 主设备特殊配置
			if(strcmp(slot_ip_map[i].role, "master") == 0) {
				printf("该设备为[主设备]\n");
				device_role = 1;                
			} else {
				device_role = 0;
				printf("该设备为[从设备]\n");
			}

			found = 1;
			break;
		}
	}
	
	if (!found) {
		printf("错误：未找到与槽位号 0x%x 对应的 IP 地址\n", actual_slot);
		return;
	}

    // 以任务的方式启动 TCP 服务器
    // 任务优先级设为 100，栈大小设为 4096，可根据实际情况调整
    if (taskSpawn("tTcpServer", 100, 0, 4096, (FUNCPTR)tcp_server_start, 8000, 0, 0, 0, 0, 0, 0, 0, 0, 0) == ERROR) {
        printf("Failed to spawn tcp server task\n");
    }
    	
    //A监听多个TCP/UDP端口。将特定端口（约定处理器A的信息采用端口8000）映射到A自己的服务，将另一个特定端口（约定采用端口8800）的流量转发给B的某个端口。
    if(device_role)
        srio_client_init();
    else
    	srio_server_init();


}

